desarrolloforos / [2015] OGame Redesign: Easy Transport

// ==UserScript==
// @name           [2015] OGame Redesign: Easy Transport
// @namespace      RiV-easytransport
// @description    Provides links to easily transport the resources needed for a building/research
// @version        1.7.4
// @include        http://*.ogame.*/game/index.php?*page=resources*
// @include        http://*.ogame.*/game/index.php?*page=station*
// @include        http://*.ogame.*/game/index.php?*page=research*
// @include        http://*.ogame.*/game/index.php?*page=fleet*
// @include        http://*.ogame.*/game/index.php?*page=preferences*
// ==/UserScript==

(function() {
	var $ = window.jQuery;
	try {
		$ = unsafeWindow.jQuery;
	} catch(e) { }

    if (!this.GM_getValue || (this.GM_getValue.toString && this.GM_getValue.toString().indexOf("not supported")>-1)) {
        this.GM_getValue=function (key,def) {
            return localStorage[key] || def;
        };
        this.GM_setValue=function (key,value) {
            return localStorage[key]=value;
        };
        this.GM_deleteValue=function (key) {
        return delete localStorage[key];
        };
    }
    
    var setValue = function(name, value) {
        GM_setValue(name + '|' + uni, JSON.stringify(value));
    }
    
    var getValue = function(name, defaultValue) {
        var val = GM_getValue(name + '|' + uni);
        if(val == undefined) return defaultValue;
        return JSON.parse(val);
    }

    // get an element via its class name | thx @ marshen for the code
    function getElementsByClass (cName, domNode) {
        if (cName == undefined || cName.length == 0) return;
            if (domNode == undefined) domNode = document;
        
        if (domNode.getElementsByClassName)
            return domNode.getElementsByClassName(cName);
        
        // browser doesn't support getElementsByClassName
        cName = " " + cName + " "; // add spaces here so that we won't find class "a" in className == "abc"
        var elements = domNode.getElementsByTagName('*');
        var res = new Array();
        for (var i = 0; i < elements.length; i++) {
            var className = " " + elements[i].className + " ";
            if (className.indexOf(cName) > -1) {
                res.push(elements[i]);
            }
        }

        return res;
    }

    // thanks to Antigame author Tarja for code
    function runScript(code) {
        if (!code || code=="") return;
		var script = document.createElement('script');
        script.setAttribute('type','text/javascript');
        script.innerHTML = code;

        document.body.appendChild(script);
        setTimeout(function(){script.parentNode.removeChild(script)}, 0);
    }

    // thanks to Antigame author Tarja for code
    function trigger(id, event) {
        var evt = document.createEvent("HTMLEvents");
        evt.initEvent(event, true, false);

        if (evt) document.getElementById(id).dispatchEvent(evt);
    }
	
	function page(str) {
		var strURL = document.URL;
		if (strURL.match(str))
			return true;
		else
			return false;
	}
		
	function inArray(obj,arr) {
		var res;
		
		for(var i = 0; i < arr.length; i++) {
			if(arr[i] == obj)
				res = i;
		}
		
		if(res >= 0) return res;
		else return -1;
	}
	
	function getTitle(node) {
		return (node && node.getAttribute) ? node.getAttribute('title') || $(node).data('tipped_restore_title') || '' : '';
	}

    document.getElementsByTagName('head')[0].appendChild(document.createElement("style"));
    var stylesheet = document.styleSheets[document.styleSheets.length-1];
	
	stylesheet.insertRule('#easyDiv { \
                          margin: 3px 0; \
                          margin-left: 15px; \
                          padding: 1px 0 0 5px; \
                          background-color: #13181D; \
                          border: 3px double black; \
                          width: 628px; \
                          font-size: 11px; \
						  float: left; \
						  position: relative; \
						  z-index: 100; \
                          }', 0);
						  
	stylesheet.insertRule('#easyDiv table { width: 600px; border-spacing: 3px 2px; }', 0);
	stylesheet.insertRule('#easyDiv td { text-align: center; }', 0);
	stylesheet.insertRule('#easyDiv td, #easyDiv th { border: 1px solid grey; padding: 5px 10px; }', 0);
	stylesheet.insertRule('#easyDiv th { font-weight: bold; }', 0);
	stylesheet.insertRule('#easyDiv a { text-decoration: none; }', 0);
						  
	stylesheet.insertRule('span.metal { color: #FF8800; }', 0);
	stylesheet.insertRule('span.crystal { color: #55B4DD; }', 0);
	stylesheet.insertRule('span.deuterium { color: #99ABCC; }', 0);
	stylesheet.insertRule('span.easyErr { color: #FF0000; }', 0);
	
	stylesheet.insertRule('div.easyMerge { \
						  width: 17px; \
						  height: 17px; \
						  display: block; \
						  float: right; \
						  background-image: url("http://gf1.geo.gfsrv.net/cdnfc/b325cc0170e184ee4c4417acd6a17a.png"); \
						  }', 0);
	stylesheet.insertRule('div.easyMergeBlue { background-position: -51px center; }', 0);
	stylesheet.insertRule('div.easyMergeGrey { background-position: -68px center; }', 0);
	stylesheet.insertRule('div.easyMergeRed { background-position: -17px center; }', 0);
	stylesheet.insertRule('div.easyMergeGreen { background-position: -34px center; }', 0);
	stylesheet.insertRule('.easyOptions { float: right; margin-right: 13px; margin-top: 3px; height: 17px; }', 0);
	stylesheet.insertRule('.easyOptions a:link, .easyOptions a:visited, .easyOptions a:hover, .easyOptions a:active { color: rgb(255,255,255); }', 0);
	stylesheet.insertRule('span.easyOptSpan { float: right; padding: 0px 5px; }', 0);
	stylesheet.insertRule('.easyTooltip { text-align: center; margin: 2px; }', 0);
	
	stylesheet.insertRule('.easyLinkDiv { width: auto; float: left; position: relative; top: -8px; left: 3px; z-index: 100; }', 0);
	
	stylesheet.insertRule('.easyLink a:link, .easyLink a:visited, .easyLink a:hover, .easyLink a:active { color: rgb(255,255,255); text-decoration: none; }', 0);
	stylesheet.insertRule('.easyLink { margin-left: 0px; padding-top: 4px; }', 0);
	
	stylesheet.insertRule('.easyTotal { width: auto; float: left; margin-left: 17px; margin-top: 3px; margin-bottom: 5px; }', 0);
	
	stylesheet.insertRule('.easyHidden { display: none; }', 0);
	
	stylesheet.insertRule('.easyPlusDiv { \
                          margin: 5px 0px 0px 5px; \
                          padding: 3px 3px 3px 3px; \
                          background-color: #13181D; \
                          border: 3px double black; \
                          width: 150px; \
                          font-size: 11px; \
						  float: left; \
						  text-align: center; \
						  position: absolute; \
						  z-index: 101; \
                          }', 0);
	

    var metaUniverse = document.getElementsByName('ogame-universe')[0].content;
	var metaCoords = document.getElementsByName('ogame-planet-coordinates')[0].content;
	var metaPlanetType = document.getElementsByName('ogame-planet-type')[0].content;
	var metaLang = document.getElementsByName('ogame-language')[0].content;
	var metaOGameVer = document.getElementsByName('ogame-version');
    var uniSpeed = parseInt(document.getElementsByName('ogame-universe-speed').item(0).content);
	
	var oldVersion = false;
	if (metaOGameVer && (metaOGameVer.length > 0)) {
		var versionParts = metaOGameVer[0].content.split ('.');
		if (parseInt(versionParts[0]) < 5)
			oldVersion = true;
	} else
		oldVersion = true;
	
    var uni = metaUniverse.split('.')[0] + metaUniverse.split('.')[2];

	var isMoon = false;
	if(metaPlanetType == 'moon')
		isMoon = true;


	/* User variables, change if you wish */

	// speed factor of the flight; 1 = 100%, 0.5 = 50% etc.
	var speedFactor = 1;

	/* End of user variables */

	//setValue('firstRun150712', true);
	if(getValue('firstRun150712', true)) {
		setValue('transportBuild', []);
		setValue('transportLevel', []);
		setValue('transportMet', []);
		setValue('transportCrys', []);
		setValue('transportDeut', []);
		setValue('transportGala', []);
		setValue('transportSolSys', []);
		setValue('transportPos', []);
		setValue('transportMoon', []);
		setValue('transportDetails', []);
		setValue('MergeIDs', []);
		setValue('easyTransport', false);
		setValue('firstRun150712', false);
	}
	
	var strBuild = '';
	var strLevel = '';
	var strGala = '';
	var strSolSys = '';
	var strPos = '';
	var transportBuild = getValue('transportBuild');
	var transportLevel = getValue('transportLevel');
	var transportMet = getValue('transportMet');
	var transportCrys = getValue('transportCrys');
	var transportDeut = getValue('transportDeut');
	var transportGala = getValue('transportGala');
	var transportSolSys = getValue('transportSolSys');
	var transportPos = getValue('transportPos');
	var transportMoon = getValue('transportMoon');
	var transportDetails = getValue('transportDetails');
	var MergeIDs = getValue('MergeIDs');
	var CombDrive = parseInt(getValue('CombDrive', 0));
	var ImpDrive = parseInt(getValue('ImpDrive', 0));
	var easyTransport = getValue('easyTransport', false);
	var easyID = getValue('easyID');

	initLang();

	function initLang() {
		langTransport = 'Transport';
		langAll = 'all';
		langMissing = 'missing';
		langDelete = 'delete';
		//langTransportLink = strBuild + ' ' + strLevel + ' to [' + strGala + ':' + strSolSys + ':' + strPos + ']';
		langNotEnoughRes = 'Not enough resources!';
		langNotEnoughShips = 'Not enough ships!';
		langPartDelivery = 'Partial delivery possible.';
		langCancel = 'Cancel';
		//langMoon = 'Moon';
		langStillMissing = 'Still missing';
		langSC = 'SCs';
		langLC = 'LCs';
		langNeeded = 'Needs';
		langTotal = 'Total';
		langMerge = 'Merge';
		langCancel = 'cancel';
		langApply = 'apply';
		langPackage = 'Transport package';
		langContains = 'Contains';
		langMet = 'Metal';
		langCrys = 'Crystal';
		langDeut = 'Deuterium';
		langLevel = 'Level';
	
		if(metaLang == 'de') {
			langTransport = 'Transport';
			langAll = 'alle';
			langMissing = 'fehlende';
			langDelete = 'löschen';
			//langTransportLink = strBuild + ' ' + strLevel + ' nach [' + strGala + ':' + strSolSys + ':' + strPos + ']';
			langNotEnoughRes = 'Nicht genügend Rohstoffe!';
			langNotEnoughShips = 'Nicht genügend Schiffe!';
			langPartDelivery = 'Teillieferung möglich.';
			langCancel = 'Abbrechen';
			//langMoon = 'Mond';
			langStillMissing = 'Noch fehlend';
			langSC = 'KTs';
			langLC = 'GTs';
			langNeeded = 'Benötigt';
			langTotal = 'Gesamt';
			langMerge = 'Fusion';
			langCancel = 'abbrechen';
			langApply = 'anwenden';
			langPackage = 'Transport-Packet';
			langContains = 'Beinhaltet';
			langMet = 'Metall';
			langCrys = 'Kristall';
			langDeut = 'Deuterium';
			langLevel = 'Stufe';
		}
	}
	
	var baseCosts = new Array();
	baseCosts[1] =   [40,     10,     0,      1.5];		//Metal Mine
	baseCosts[2] =   [30,     15,     0,      1.6];		//Crystal Mine
	baseCosts[3] =   [150,    50,     0,      1.5];		//Deuterium Synthesizer
	
	baseCosts[4] =   [50,     20,     0,      1.5];		//Solar Plant
	baseCosts[12] =  [500,    200,    100,    1.8];		//Fusion Reactor
	
	baseCosts[22] =  [500,    0,      0,      2.0];		//Metal Storage
	baseCosts[23] =  [500,    250,    0,      2.0];		//Crystal Storage
	baseCosts[24] =  [500,    500,    0,      2.0];		//Deuterium Tank
	
	baseCosts[25] =  [1150,   0,      0,      2.3];		//Shielded Metal Den
	baseCosts[26] =  [1150,   575,    0,      2.3];		//Underground Crystal Den
	baseCosts[27] =  [1150,   1150,   0,      2.3];		//Seabed Deuterium Den
	
	
	baseCosts[14] =  [200,    60,     100,    2.0];		//Robotics Factory
	baseCosts[21] =  [200,    100,    50,     2.0];		//Shipyard
	baseCosts[31] =  [100,    200,    100,    2.0];		//Research Lab
	baseCosts[44] =  [10000,  10000,  500,    2.0];		//Missile Silo
	baseCosts[15] =  [500000, 250000, 50000,  2.0];		//Nanite Factory
	baseCosts[33] =  [0,      25000,  50000,  2.0];		//Terraformer
	baseCosts[34] =  [10000,  20000,  0,      2.0];		//Alliance Depot
	
	baseCosts[41] =  [10000,  20000,  10000,  2.0];		//Lunar Base
	baseCosts[42] =  [10000,  20000,  10000,  2.0];		//Sensor Phalanx
	baseCosts[43] =  [1000000,2000000,1000000,2.0];		//Jump Gate
	
	
	baseCosts[113] = [0,      400,   200,    2.0];		//Energy Technology
	baseCosts[120] = [100,    50,    0,      2.0];		//Laser Technology
	baseCosts[121] = [500,    150,   50,     2.0];		//Ion Technology
	baseCosts[114] = [0,      2000,  1000,   2.0];		//Hyperspace Technology
	baseCosts[122] = [1000,   2000,  500,    2.0];		//Plasma Technology
	
	baseCosts[115] = [200,   0,      300,    2.0];		//Combustion Drive
	baseCosts[117] = [1000,  2000,   300,    2.0];		//Impulse Drive
	baseCosts[118] = [5000,  10000,  3000,   2.0];		//Hyperspace Drive
	
	baseCosts[106] = [100,   500,    100,    2.0];		//Espionage Technology
	baseCosts[108] = [0,     200,    300,    2.0];		//Computer Technology
	baseCosts[124] = [100,   100,    100,    1.75];		//Astrophysics
	baseCosts[123] = [120000,200000, 80000,  2.0];		//Intergalactic Research Network
	baseCosts[199] = [0,     0,      0,      2.0];		//Graviton Technology
	
	baseCosts[109] = [400,   100,    0,      2.0];		//Weapons Technology
	baseCosts[110] = [100,   300,    0,      2.0];		//Shielding Technology
	baseCosts[111] = [500,   0,      0,      2.0];		//Armour Technology

	
	
	function removeSeparator(str) {
		if (!str) return null;
		return parseInt(str.replace(/\D/g, ''));
	}
	
	function formatNumber(num) {
		var separator = '.';
		var res = '';
		num = ''+num;

		while(num.length > 3) {
			res = separator + num.slice(-3) + res;
			num = num.substr(0, num.length - 3);
		}

		res = num + res;
		return res;
	}
	
	function sumArray(array) {
		var res = 0;
		for(var i = 0; i < array.length; i++)
			res = res + array[i];
			
		return res;
	}

	function getBuildingInfo() {
		var buildID = document.getElementsByName('type')[0].value;
		var res = new Array();

		res.Name = document.getElementById('content').innerHTML;
		res.Name = res.Name.split('<h2>')[1];
		res.Name = res.Name.split('<')[0];
    
		res.Level = getElementsByClass('level', document.getElementById('content'))[0].innerHTML;
		res.Level = parseInt(res.Level.match(/\d+/)[0]) + 1;

		res.Met = baseCosts[buildID][0];
		res.Crys = baseCosts[buildID][1];
		res.Deut = baseCosts[buildID][2];
		res.Mod = baseCosts[buildID][3];

		return res;
	}
	
	function getPlanetInfo(ress) {
		var res = document.getElementById ("resources_" + ress).textContent;
		res = removeSeparator(res);
		return parseInt(res);
	}

	function getDistance(Gala, SolSys, Pos, id) {
		if (Gala == transportGala[id] && SolSys == transportSolSys[id] && Pos == transportPos[id]) 
			res = 5;
		else if (Gala == transportGala[id] && SolSys == transportSolSys[id]) 
			res = Math.abs(Pos - transportPos[id]) * 5 + 1000;
		else if (Gala == transportGala[id])
			res = Math.abs(SolSys - transportSolSys[id]) * 95 + 2700;
		else
			res = Math.abs(Gala - transportGala[id]) * 20000;

		return parseInt(res);
	}

	function getFlightTime(dist, velo) {
		var res = ((3500 / speedFactor) * Math.pow((dist * 10 / velo), 0.5) + 10) / uniSpeed;
		return parseInt(res);
	}

	function getShipInfo(info, ship) {
		if(ship == 'sc') {
			if(info == 'id') res = '202';
			if(info == 'velocity') {
				if(ImpDrive >= 5) res = 10000 + 10000 * 0.2 * ImpDrive;
				else res = 5000 + 5000 * 0.1 * CombDrive;
			}
			if(info == 'baseconsumption') {
				if(ImpDrive >= 5) res = 20;
				else res = 10;
			}
			if(info == 'capacity') res = 5000;
		} else if(ship == 'lc') { 
			if(info == 'id') res = '203';
			if(info == 'velocity') res = 7500 + 7500 * 0.1 * CombDrive;
			if(info == 'capacity') res = 25000;
			if(info == 'baseconsumption') res = 50;
		}

		return res;
	}

	function getConsumption(fTime, dist, velo, bCons) {
		var value = 35000 / (fTime * uniSpeed - 10) * Math.pow((dist * 10 / velo), 0.5);
		var res = bCons * dist / 35000 * Math.pow((value / 10 + 1), 2);

		return parseInt(res);
	}

	function getNeededShipCount(id, ship) {
		var res = {};
		var startGala = metaCoords.split(':')[0];
		var startSolSys = metaCoords.split(':')[1];
		var startPos = metaCoords.split(':')[2];

		var Velocity = getShipInfo('velocity', ship);
		var Distance = getDistance(startGala, startSolSys, startPos, id);
		var flightTime = getFlightTime(Distance, Velocity);
		var baseConsumption = getShipInfo('baseconsumption', ship);
		var Capacity = getShipInfo('capacity', ship);

		var Consumption = getConsumption(flightTime, Distance, Velocity, baseConsumption) + 1;

		res.total = Math.ceil((transportMet[id] + transportCrys[id] + transportDeut[id]) / (Capacity - Consumption));
		
		var Metal = getPlanetInfo('metal');
		var Crystal = getPlanetInfo('crystal');
		var Deuterium = getPlanetInfo('deuterium');
		
		Metal = (Metal > transportMet[id]) ? transportMet[id] : Metal;
		Crystal = (Crystal > transportCrys[id]) ? transportCrys[id] : Crystal;
		Deuterium = (Deuterium > transportDeut[id]) ? transportDeut[id] : Deuterium;
		res.possible = Math.ceil((Metal + Crystal + Deuterium) / (Capacity - Consumption));

		return res;
	}

	function getShipCount(ship) {
		var shipID = getShipInfo('id', ship);
		var res = document.getElementById('button' + shipID);
		res = res.innerHTML;
		res = res.substring(res.indexOf('(')+1, res.indexOf(')'));

		return removeSeparator(res);
	}

	function addToQueue(bld, lvl, met, cry, deu, gal, sol, pos, moon, det) {
		var i = transportBuild.length;
		transportBuild[i] = bld;
		transportLevel[i] = lvl;
		transportMet[i] = met;
		transportCrys[i] = cry;
		transportDeut[i] = deu;
		transportGala[i] = gal;
		transportSolSys[i] = sol;
		transportPos[i] = pos;
		transportMoon[i] = moon; 
		transportDetails[i] = det;
    
		setValue('transportBuild', transportBuild);
		setValue('transportLevel', transportLevel);
		setValue('transportMet', transportMet);
		setValue('transportCrys', transportCrys);
		setValue('transportDeut', transportDeut);
		setValue('transportGala', transportGala);
		setValue('transportSolSys', transportSolSys);
		setValue('transportPos', transportPos);
		setValue('transportMoon', transportMoon);
		setValue('transportDetails', transportDetails);
	}

	function setResources(start,end,allmiss) {
		var buildingInfo = getBuildingInfo();
		var Build = buildingInfo.Name;
		var Level = start + ' - ' + end;
		if(start == end) Level = start;
		var Cycles = end-start+1;
		
		var totalMet = 0;
		var totalCrys = 0;
		var totalDeut = 0;
		
		if(document.getElementsByName('type')[0].value == 124) {
			for(var i = 0; i < Cycles; i++) {
				totalMet += Math.floor(100 * Math.floor(0.5 + 40 * Math.pow(1.75, start+i-1)));
				totalCrys += Math.floor(100 * Math.floor(0.5 + 80 * Math.pow(1.75, start+i-1)));
				totalDeut += Math.floor(100 * Math.floor(0.5 + 40 * Math.pow(1.75, start+i-1)));
			}
		} else {
			for(var i = 0; i < Cycles; i++) {
				totalMet += Math.floor(buildingInfo.Met * Math.pow(buildingInfo.Mod, start+i));
				totalCrys += Math.floor(buildingInfo.Crys * Math.pow(buildingInfo.Mod, start+i));
				totalDeut += Math.floor(buildingInfo.Deut * Math.pow(buildingInfo.Mod, start+i));
			}
		}
		
		var Met, Crys, Deut;
		if(allmiss == 'all') {
			Met = totalMet;
			Crys = totalCrys;
			Deut = totalDeut;
		} else if(allmiss == 'miss') {
			var Metal = getPlanetInfo('metal');
			var Crystal = getPlanetInfo('crystal');
			var Deuterium = getPlanetInfo('deuterium');
			Met = ((totalMet-Metal) > 0) ? (totalMet-Metal) : 0;
			Crys = ((totalCrys-Crystal) > 0) ? (totalCrys-Crystal) : 0;
			Deut = ((totalDeut-Deuterium) > 0) ? (totalDeut-Deuterium) : 0;
		}
		
		Gala = metaCoords.split(':')[0];
		SolSys = metaCoords.split(':')[1];
		Pos = metaCoords.split(':')[2];
    
		addToQueue(Build, Level, Met, Crys, Deut, Gala, SolSys, Pos, isMoon, '');
		
		if(transportBuild.length == 1) evt = '';
		else evt = 'change';
		showLink(evt);
	}
	
	function transportPlus(e) {	
		var parentNode = document.getElementsByTagName('body')[0];
		
		if(document.getElementById('easyPlusDiv'))
			parentNode.removeChild(document.getElementById('easyPlusDiv'))
		
		var easyPlus = document.createElement('div');
		easyPlus.className = 'easyPlusDiv';
		easyPlus.id = 'easyPlusDiv';
		easyPlus.style.left = e.clientX + 'px';
		easyPlus.style.top = e.clientY + 'px';
		easyPlus.innerHTML = '<p class="easyLink" style="position:absolute; top:-2px; left: 147px; padding-top:0px;"><a href="javascript:void(0);" id="closePlus">x</a></p>' + langLevel + ' <input style="width: 25px; text-align:center; font-size: 11px;" id="plusLevelMin" value="' + (getBuildingInfo().Level-1) + '"> - <input style="width: 25px; text-align:center; font-size: 11px;" id="plusLevel" value="' + getBuildingInfo().Level + '">';
		parentNode.appendChild(easyPlus);
		document.getElementById('plusLevel').focus();
		document.getElementById('plusLevel').select();
		
		document.getElementById('closePlus').addEventListener('click', function(e) { parentNode.removeChild(document.getElementById('easyPlusDiv')); }, false);
	}

	function insertText(e) {
		if(e.target.id != 'content') return;
		
		if(document.getElementById('easyPlusDiv'))
			document.getElementsByTagName('body')[0].removeChild(document.getElementById('easyPlusDiv'))
		
		stylesheet.insertRule('#costs ul#resources li { width: 60px; }', 0);

		var parentNode = document.getElementById('costs');
		
		var easyLinks = document.createElement('div');
		easyLinks.className = 'easyLinkDiv';
		easyLinks.innerHTML = '<p class="easyLink" style="float: left; color: rgb(122,168,54); margin-left: 0px; font-weight: bold;">Transport (<a href="javascript:void(0);" id="transportPlus">+</a>):</p><p style="clear: both;" class="easyLink"><a href="javascript:void(0);" id="all_res">' + langAll + '</a> | <a href="javascript:void(0);" id="missing_res">' + langMissing + '</a></p></div>';
		parentNode.appendChild(easyLinks);

		document.getElementById('all_res').addEventListener('click', 		function(e) { 
																				if(document.getElementById('plusLevel')) 
																					setResources(parseInt(document.getElementById('plusLevelMin').value)+1, document.getElementById('plusLevel').value, 'all'); 
																				else 
																					setResources(getBuildingInfo().Level, getBuildingInfo().Level, 'all'); 
																					
																				if(document.getElementById('easyPlusDiv')) 
																					document.getElementsByTagName('body')[0].removeChild(document.getElementById('easyPlusDiv'));  }, false);

		document.getElementById('missing_res').addEventListener('click', 	function(e) { 
																				if(document.getElementById('plusLevel')) 
																					setResources(parseInt(document.getElementById('plusLevelMin').value)+1, document.getElementById('plusLevel').value, 'miss'); 
																				else 
																					setResources(getBuildingInfo().Level, getBuildingInfo().Level, 'miss'); 
																					
																				if(document.getElementById('easyPlusDiv')) 
																					document.getElementsByTagName('body')[0].removeChild(document.getElementById('easyPlusDiv')); }, false);
																					
		document.getElementById('transportPlus').addEventListener('click', transportPlus, false);
	}

	function deleteTransport(e, ID) {
		var id;
		var doDelete = false;
		
		if(e != '') {
			if(e.target.id == '') {
				setValue('tempMet', removeSeparator(document.getElementById('metal').value));
				setValue('tempCrys', removeSeparator(document.getElementById('crystal').value));
				setValue('tempDeut', removeSeparator(document.getElementById('deuterium').value));
			
				id = easyID;
				transportMet[id] = transportMet[id] - getValue('tempMet');
				transportCrys[id] = transportCrys[id] - getValue('tempCrys');
				transportDeut[id] = transportDeut[id] - getValue('tempDeut');
			} else 
				id = e.target.id.split('delete_transport')[1];
				
			if(transportMet[id] == 0 && transportCrys[id] == 0 && transportDeut[id] == 0)
				doDelete = true;
				
			if(e.target.id.match(/delete_transport/))
				doDelete = true;
		} else {
			id = ID;
			doDelete = true;
		}

		if(doDelete) {
			transportBuild.splice(id, 1);
			transportLevel.splice(id, 1);
			transportMet.splice(id, 1);
			transportCrys.splice(id, 1);
			transportDeut.splice(id, 1);
			transportGala.splice(id, 1);
			transportSolSys.splice(id, 1);
			transportPos.splice(id, 1);
			transportMoon.splice(id, 1);
			transportDetails.splice(id, 1);
		}
    
		setValue('transportBuild', transportBuild);
		setValue('transportLevel', transportLevel);
		setValue('transportMet', transportMet);
		setValue('transportCrys', transportCrys);
		setValue('transportDeut', transportDeut);
		setValue('transportGala', transportGala);
		setValue('transportSolSys', transportSolSys);
		setValue('transportPos', transportPos);
		setValue('transportMoon', transportMoon);
		setValue('transportDetails', transportDetails);
		setValue('easyTransport', false);

		showLink('change');
	}

	function fillIn(e) {
		if(page('fleet1')) {
			var id = e.target.id.match(/\d+/);
			setValue('easyID', id);
			
			if(e.target.id.match(/easytrsc/)) ship = 'sc';
			else if(e.target.id.match(/easytrlc/)) ship = 'lc';
			var shipID = getShipInfo('id', ship);
			//var Capacity = getShipInfo('capacity', ship);
			var Count = getNeededShipCount(id, ship).possible;
			
			/* if(Count > getShipCount(ship)) {
				var restCount = (transportMet[id] + transportCrys[id] + transportDeut[id]) - (getShipCount(ship) * Capacity);
			} */

			setValue('easyTransport', true);
			
			var arrayShipIDs = [204, 205, 206, 207, 215, 211, 213, 214, 202, 203, 208, 209, 210];
			for(var i = 0; i < arrayShipIDs.length; i++)
				document.getElementById('ship_' + arrayShipIDs[i]).value = '';
				
			document.getElementById('ship_' + shipID).value = Count;
			
			trigger('ship_' + shipID, 'change');
		}
	}
	
	function applyMerge(e) {
		MergeIDs = getValue('MergeIDs');
		var sumID = MergeIDs[0];
		MergeIDs.sort(function(a,b){return a-b;});
		
		if(sumID != undefined) {
			var sumMet = 0;
			var sumCrys = 0;
			var sumDeut = 0;
			var sumDetails = '<b>' + langContains + ':</b><br>';
		
			for(var i = 0; i < MergeIDs.length; i++) {
				sumMet += transportMet[MergeIDs[i]];
				sumCrys += transportCrys[MergeIDs[i]];
				sumDeut += transportDeut[MergeIDs[i]];
				sumDetails += transportBuild[MergeIDs[i]] + ' ' + transportLevel[MergeIDs[i]] + '<br>';
			}
			sumDetails += '<br>';
		
			addToQueue(langPackage, ' ', sumMet, sumCrys, sumDeut, transportGala[sumID], transportSolSys[sumID], transportPos[sumID], transportMoon[sumID], sumDetails);
		
			for(var i = MergeIDs.length - 1; i > -1; i--) {
				deleteTransport('', MergeIDs[i]);
			}
		}
		
		showLink('change');
	}
	
	function cancelMerge(e) {
		setValue('MergeIDs', []);
		showLink('change');
	}
	
	function markForMerge(e) {
		var id = e.target.id.match(/\d+/);
		MergeIDs = getValue('MergeIDs');
		var arrayPt = inArray(String(id), MergeIDs);
		
		if(arrayPt != -1) {
			MergeIDs.splice(arrayPt, 1);
			setValue('MergeIDs', MergeIDs);
			document.getElementById('easyMergeCell' + id).className = 'easyMerge easyMergeRed';
		} else {
			MergeIDs[MergeIDs.length] = id;
			setValue('MergeIDs', MergeIDs);
			document.getElementById('easyMergeCell' + id).className = 'easyMerge easyMergeGreen';
		}
		
		if(getValue('MergeIDs') != '') {
			for(var i = 0; i < transportBuild.length; i++) {
				var coords1 = transportGala[i] + ':' + transportSolSys[i] + ':' + transportPos[i] + ' ' + transportMoon[i];
				var coords2 = transportGala[id] + ':' + transportSolSys[id] + ':' + transportPos[id] + ' ' + transportMoon[id];
		
				if(coords1 != coords2) {
					document.getElementById('easyTblDel' + i).innerHTML = '<div id="easyMergeCell' + i + '" class="easyMerge easyMergeGrey" style="float: none; margin-left: auto; margin-right: auto;"></div></a>';
				}
			}
		} else {
			showMergeIcons();
		}
	}
	
	function showMergeIcons(e) {	
		setValue('MergeIDs', []);
		document.getElementById('easyOptions').innerHTML = '<a href="javascript:void(0);" id="easyMergeApply">\n' +
														   '	<span class="easyOptSpan">' + langApply + '</span>\n' +
														   '	<div class="easyMerge easyMergeGreen"></div>\n' +
														   '</a>\n' +
														   '<a href="javascript:void(0);" id="easyMergeCancel">\n' +
														   '	<span class="easyOptSpan">' + langCancel + '</span>\n' +
														   '	<div class="easyMerge easyMergeRed"></div>\n' +
														   '</a>\n';
														   
		document.getElementById('easyMergeApply').addEventListener('click', applyMerge, false);
		document.getElementById('easyMergeCancel').addEventListener('click', cancelMerge, false);
		
		for(var i = 0; i < transportBuild.length; i++) {
			document.getElementById('easyTblDel' + i).innerHTML = '<a href="javascript:void(0);" id="easyMergeLink' + i + '"><div id="easyMergeCell' + i + '" class="easyMerge easyMergeRed" style="float: none; margin-left: auto; margin-right: auto;"></div></a>';
			document.getElementById('easyTblCoords' + i).innerHTML += '';
			
			document.getElementById('easyMergeLink' + i).addEventListener('click', markForMerge, false);
		}
	}
	
	function toggleTopBot(e) {
		if(getValue('prefTopBot', 'top') == 'top') {
			setValue('prefTopBot', 'bot');
		} else {
			setValue('prefTopBot', 'top');
		}
		
		showLink('toggleTopBot');
	}
	
	function toggleMinMax(e) {
		if(getValue('prefMinMax', 'max') == 'max') {
			setValue('prefMinMax', 'min');
		} else {
			setValue('prefMinMax', 'max');
		}
		
		showLink('change');
	}

	function showLink(evt) {	
		if(page('fleet1') && !getElementsByClass('allornonewrap')[0]) return;
		
		if(getValue('prefTopBot', 'top') == 'bot')		
			var parentNode = document.getElementById('inhalt');
		else
			var parentNode = document.getElementById('contentWrapper');
		
		if(evt == 'toggleTopBot') {
			if(getValue('prefTopBot', 'top') == 'bot')
				document.getElementById('contentWrapper').removeChild(document.getElementById('easyDiv'));
			else
				document.getElementById('inhalt').removeChild(document.getElementById('easyDiv'));
		}
		
		if(evt == 'change') parentNode.removeChild(document.getElementById('easyDiv'));
		
		if(transportBuild.length > 0) {
			var transportLinkCont = document.createElement('div');
			transportLinkCont.id = 'easyDiv';
			transportLinkCont.align = 'center';
			transportLinkCont.innerHTML = '';

			var strMoon = '';

			var transportLink = document.createElement('span');
			transportLink.id = 'transportLink';
			transportLink.innerHTML = '';

			var Metal = getPlanetInfo('metal');
			var Crystal = getPlanetInfo('crystal');
			var Deut = getPlanetInfo('deuterium');

			var easyTbl = '';
			easyTbl = '<table id="easyTbl" align="center">\n';
			//easyTbl += '<tr><td colspan="5" style="align: right;"><div class="easyMerge"></div>test</td></tr>\n';
			for(var i = 0; i < transportBuild.length; i++) {
				strBuild = transportBuild[i];
				strLevel = transportLevel[i];
				strGala = transportGala[i];
				strSolSys = transportSolSys[i];
				strPos = transportPos[i];
			
				if(transportMoon[i] == true) strMoon = 'M';
				else strMoon = '';
			
				var strError = '';
				var Metal = getPlanetInfo('metal');
				var Crystal = getPlanetInfo('crystal');
				var Deuterium = getPlanetInfo('deuterium');
			
				if(Metal < transportMet[i] || Crystal < transportCrys[i] || Deuterium < transportDeut[i])
					strError += '<br><br><span class=easyErr>' + langNotEnoughRes + '</span>';
				
				if(strError != '') 
					strError += '<br><br><span class=easyErr>' + langPartDelivery + '</span>';
					
				transportDetails[i] = (transportDetails[i] != undefined) ? transportDetails[i] : '';

				if(!oldVersion) {
					easyTbl += '	<tr>\n';
					easyTbl += '		<th><a class="tooltipBottom" title="<div class=easyTooltip>' + transportDetails[i] + '<b>' + langStillMissing + ':</b><br>' + langMet + ': <span class=metal>' + formatNumber(transportMet[i]) + '</span><br>' + langCrys + ': <span class=crystal>' + formatNumber(transportCrys[i]) + '</span><br>' + langDeut + ': <span class=deuterium>' + formatNumber(transportDeut[i]) + '</span>' + strError + '</div>" href="javascript:void(0);" id="easytransport' + i + '">' + strBuild + ' ' + strLevel + '</a></td>\n';
					easyTbl += '		<td id="easyTblCoords' + i + '">[' + strGala + ':' + strSolSys + ':' + strPos + '] ' + strMoon + '</td>\n';
					easyTbl += '		<td><a class="tooltipBottom" title="' + getNeededShipCount(i, 'sc').total + ' (' + getNeededShipCount(i, 'sc').possible + ')" href="javascript:void(0);" id="easytrsc' + i + '">' + langSC + '</a></td>\n';
					easyTbl += '		<td><a class="tooltipBottom" title="' + getNeededShipCount(i, 'lc').total + ' (' + getNeededShipCount(i, 'lc').possible + ')" href="javascript:void(0);" id="easytrlc' + i + '">' + langLC + '</a></td>\n';
					easyTbl += '		<td id="easyTblDel' + i + '"><a href="javascript:void(0);" id="delete_transport' + i + '">' + langDelete + '</a></td>\n';
					easyTbl += '	</tr>\n';
				} else {		
					easyTbl += '	<tr>\n';
					easyTbl += '		<th><a class="tipsStandard" title="|' + transportDetails[i] + langStillMissing + ':<br><br>' + langMet + ': <span class=metal>' + formatNumber(transportMet[i]) + '</span><br>' + langCrys + ': <span class=crystal>' + formatNumber(transportCrys[i]) + '</span><br>' + langDeut + ': <span class=deuterium>' + formatNumber(transportDeut[i]) + '</span>' + strError + '" href="javascript:void(0);" id="easytransport' + i + '">' + strBuild + ' ' + strLevel + '</a></td>\n';
					easyTbl += '		<td id="easyTblCoords' + i + '">[' + strGala + ':' + strSolSys + ':' + strPos + '] ' + strMoon + '</td>\n';
					easyTbl += '		<td><a class="tipsStandard" title="|' + langNeeded + ': ' + getNeededShipCount(i, 'sc').total + ' (' + getNeededShipCount(i, 'sc').possible + ')" href="javascript:void(0);" id="easytrsc' + i + '">' + langSC + '</a></td>\n';
					easyTbl += '		<td><a class="tipsStandard" title="|' + langNeeded + ': ' + getNeededShipCount(i, 'lc').total + ' (' + getNeededShipCount(i, 'lc').possible + ')" href="javascript:void(0);" id="easytrlc' + i + '">' + langLC + '</a></td>\n';
					easyTbl += '		<td id="easyTblDel' + i + '"><a href="javascript:void(0);" id="delete_transport' + i + '">' + langDelete + '</a></td>\n';
					easyTbl += '	</tr>\n';
				}
			}
			easyTbl += '</table>\n';
			easyTbl += '<div class="easyTotal">' + langTotal + ': <span class="metal">' + formatNumber(sumArray(transportMet)) + ' ' + langMet + '</span>, <span class="crystal">' + formatNumber(sumArray(transportCrys)) + ' ' + langCrys + '</span>, <span class="deuterium">' + formatNumber(sumArray(transportDeut)) + ' ' + langDeut + '</span></div>';
			transportLink.innerHTML += easyTbl;
			
			var strTopBot;
			if(getValue('prefTopBot', 'top') == 'top')
				strTopBot = 'bot';
			else
				strTopBot = 'top';
				
			var strMinMax;
			if(getValue('prefMinMax', 'max') == 'max')
				strMinMax = 'min';
			else
				strMinMax = 'max';
			
			var easyOpts = '';
			easyOpts += '<div id="easyOptions" class="easyOptions">\n' +
						'	<span class="easyOptSpan"><a href="javascript:void(0);" id="easyMinMax">' + strMinMax + '</a></span>\n' +
						'	<span class="easyOptSpan">|</span>\n' +
						'	<span class="easyOptSpan"><a href="javascript:void(0);" id="easyTopBot">' + strTopBot + '</a></span>\n';						
			if(getValue('prefMinMax', 'max') == 'max') easyOpts += '	<span class="easyOptSpan">|</span>\n';
			easyOpts += '	<a href="javascript:void(0);" id="easyMergeLink" class="easyLink">\n' +
						'		<span class="easyOptSpan">' + langMerge + '</span>\n' +
						'		<div class="easyMerge easyMergeBlue"></div>\n' +
						'	</a>\n' +
						'</div>';
			
			transportLink.innerHTML += easyOpts;
									  
		
			transportLinkCont.appendChild(transportLink);
			
			if(getValue('prefTopBot', 'top') == 'bot')
				parentNode.appendChild(transportLinkCont);
			else
				parentNode.insertBefore(transportLinkCont, document.getElementById('inhalt'));
				
			if(getValue('prefMinMax', 'max') == 'min') {
				document.getElementById('easyTbl').className = 'easyHidden';
				document.getElementById('easyMergeLink').className = 'easyHidden';
			}
    
			for(var i = 0; i < transportBuild.length; i++) {
				document.getElementById('delete_transport' + i).addEventListener('click', deleteTransport, false);
				document.getElementById('easytrsc' + i).addEventListener('click', fillIn, false);
				document.getElementById('easytrlc' + i).addEventListener('click', fillIn, false);
			}
			
			document.getElementById('easyMergeLink').addEventListener('click', showMergeIcons, false);
			document.getElementById('easyTopBot').addEventListener('click', toggleTopBot, false);
			document.getElementById('easyMinMax').addEventListener('click', toggleMinMax, false);
		}
	}

	if(page('resources') || page('station') || page('research'))
		document.getElementById('planet').addEventListener('DOMNodeInserted', insertText, false);

	if(page('fleet1') || page('resources') || page('station') || page('research')) {
		setValue('easyTransport', false);
		if(transportBuild.length > 0) {
			showLink('');
		}
	}

	if(page('fleet2') && easyTransport) {
		document.getElementById('galaxy').value = transportGala[easyID];
		document.getElementById('system').value = transportSolSys[easyID];
		document.getElementById('position').value = transportPos[easyID];

		if(transportMoon[easyID]) trigger('mbutton', 'click');
		else trigger('pbutton', 'click');

		trigger('galaxy', 'change');
	}

	if(page('fleet3') && easyTransport) {
		document.getElementById('metal').value = transportMet[easyID];
		document.getElementById('crystal').value = transportCrys[easyID];
		document.getElementById('deuterium').value = transportDeut[easyID];

		trigger('missionButton3', 'click');

		runScript("setTimeout(function(){checkRessourceByType('metal');checkRessourceByType('crystal');checkRessourceByType('deuterium');updateVariables();},0)");
		
		/* document.getElementById('metal').addEventListener('change', function() { setValue('tempMet', removeSeparator(document.getElementById('metal').value)) }, false);
		document.getElementById('crystal').addEventListener('change', function() { setValue('tempCrys', removeSeparator(document.getElementById('crystal').value)) }, false);
		document.getElementById('deuterium').addEventListener('change', function() { setValue('tempDeut', removeSeparator(document.getElementById('deuterium').value)) }, false); */
		
		document.getElementById('start').addEventListener('click', deleteTransport, false);
	}

	if(page('research')) {
		var CombDrive = document.getElementById('inhalt').innerHTML.split('details115')[1];
		CombDrive = CombDrive.match(/\d+/)[0];
		setValue('CombDrive', CombDrive);

		var ImpDrive = document.getElementById('inhalt').innerHTML.split('details117')[1];
		ImpDrive = ImpDrive.match(/\d+/)[0];
		setValue('ImpDrive', ImpDrive);
	}
}) ()